package br.com.prontuario.faces;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;

import org.primefaces.context.RequestContext;

import br.com.prontuario.entidade.Raca;
import br.com.prontuario.logica.contract.DefaultLogicaContract;
import br.com.prontuario.util.FacesUtil;
import br.com.prontuario.util.StringUtil;

@ManagedBean(name="racaFaces")
@ViewScoped
public class RacaFaces extends FacesUtil {
	
	private static final long serialVersionUID = 1L;

	@ManagedProperty(value = "#{logicaDefault}")
	private DefaultLogicaContract<Raca> logicaRaca;
	
	private Raca raca = new Raca();
	private List<Raca> listaRaca = new ArrayList<>();
	private String racaBusca;

	private Boolean isPopup = false;
	
	private String nomeTemplate;
	
	public RacaFaces() {
		Boolean popup = (Boolean) getSession().getAttribute("isPopup");
		if (popup != null) {
			isPopup = popup;
		}
	}
	
	@PostConstruct
	public void init() {
		this.buscarRaca();
		if (isPopup != null && isPopup) {
			nomeTemplate = "/templates/templateDialog.xhtml";
		} else {
			nomeTemplate = "/templates/template.xhtml";
		}

	}
	
	@PreDestroy
	public void finalizar() {
		getSession().setAttribute("isPopup", null);
	}


	public void adicionar() {
		try {
			if (validaCampos()) {
				logicaRaca.adicionar(raca);
				adicionarMensagem("Raça adicionada com sucesso");
				this.buscarRaca();
				fecharModal("dialogRaca");
			} else {
				return;
			}
			
		} catch (Exception e) {
			adicionarMensagem("Houve um erro ao adicionar a Raça");
		}
	}
	
	public void prepararAdicionar() {
		this.raca = new Raca();
		abrirModal("dialogRaca");
	}
	
	public void selecionarRegistro(Long idArea, boolean editar) {
		try {
			this.raca = logicaRaca.obterPorId(Raca.class,idArea);
			
			if (editar) {
				abrirModal("dialogRaca");
			} else {
				abrirModal("dialogExcluir");
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void editar() {
		try {
			if (validaCampos()) {
				logicaRaca.editar(this.raca);
				adicionarMensagem("Raça editada com sucesso");
				fecharModal("dialogRaca");
				this.buscarRaca();
			} else {
				return;
			}
			
		} catch (Exception e) {
			adicionarMensagem("Houve um erro ao editar a Raça");
		}
	}
	
	public void remover() {
		try {
			logicaRaca.remover(Raca.class, this.raca.getId());
			adicionarMensagem("Raça removida com sucesso");
			fecharModal("dialogExcluir");
			this.buscarRaca();
		} catch (Exception e) {
			adicionarMensagem("Houve um erro ao remover a Raça");
		}
	}
	
	public void buscarRaca() {
		if (listaRaca != null) {
			this.listaRaca.clear();
		}
		
		String campoBuscaOrdenacao = "nome";
		try {
			if (!StringUtil.textoPreenchido(racaBusca)) {
				this.listaRaca =  logicaRaca.buscarTodos(Raca.class, campoBuscaOrdenacao);
			} else {
				this.listaRaca = logicaRaca.buscarPorCampo(Raca.class, campoBuscaOrdenacao, racaBusca, campoBuscaOrdenacao);
			}
		} catch (Exception e) {
			adicionarMensagem("Houve um erro ao buscar as informações");
		}
	}
	
	public boolean validaCampos() {
		boolean valido = true;
		
		if (!StringUtil.textoPreenchido(this.raca.getNome())) {
			adicionarMensagem("O campo nome é obrigatório");
			valido = false;
		}
		return valido;
	}
	
	public List<Raca> autoComplete(String query) {
		List<Raca> suggestions = new ArrayList<>();
		if (query.length() > 2) {
			try {
				suggestions = logicaRaca.buscarPorCampo(Raca.class, "nome", query, "nome");
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return suggestions;
    }

    public void exibirDialogRaca() {
    	abrirDialogFramework("raca", true);
    }

	public void selecionarNoDialog(Raca raca) {
        RequestContext.getCurrentInstance().closeDialog(raca);
    }

	
	public void setlogicaRaca(DefaultLogicaContract<Raca> logicaRaca) {
		this.logicaRaca = logicaRaca;
	}

	public List<Raca> getListaRaca() {
		return listaRaca;
	}

	public void setListaRaca(List<Raca> listaRaca) {
		this.listaRaca = listaRaca;
	}

	public String getRacaBusca() {
		return racaBusca;
	}

	public void setRacaBusca(String RacaBusca) {
		this.racaBusca = RacaBusca;
	}

	public Raca getRaca() {
		return raca;
	}

	public void setRaca(Raca Raca) {
		this.raca = Raca;
	}

	public Boolean getIsPopup() {
		return isPopup;
	}

	public void setIsPopup(Boolean isPopup) {
		this.isPopup = isPopup;
	}

	public String getNomeTemplate() {
		return nomeTemplate;
	}

	public void setNomeTemplate(String nomeTemplate) {
		this.nomeTemplate = nomeTemplate;
	}
	
	
}